package zju.xmsx.acm.search.back.dao;

import org.elasticsearch.search.SearchHits;
import org.springframework.stereotype.Repository;
import zju.xmsx.acm.search.back.dto.SearchFilter;

@Repository
public interface ElasticSearcher {

    /**
     * 根据标题关键词检索文献
     * @param keys 关键词
     * @param offset 查询结果的偏移量，根据前端的页面数与页面大小进行计算
     * @param size 需要返回的结果数量
     * @return 返回未处理的查询结果，内容为文献文档
     */
    SearchHits searchByTitleKeyWord(String keys, int offset, int size);

    /**
     * 根据标题关键词与过滤器检索文献
     * @param keys 关键词
     * @param offset 偏移量
     * @param size 需要的结果数量
     * @param filter 检索过滤器
     * @return 需进一步处理的查询结果
     */
    SearchHits searchByTitleKeyWord(String keys, int offset, int size, SearchFilter filter);

    /**
     * 根据作者关键字检索作者列表
     * @param keys 作者关键字
     * @param offset 偏移量
     * @param size 需要结果数量
     * @return 查询到的作者列表
     */
    SearchHits searchAuthorList(String keys, int offset, int size);

    /**
     * 根据作者完整姓名查询数据库中其所著文献
     * @param keys 作者完整姓名字符串
     * @param offset 偏移量
     * @param size 需要结果数量
     * @return 该作者的文献内容
     */
    SearchHits searchByAuthorExact(String keys, int offset, int size);

    /**
     * 查找某一作者的文献，带过滤器
     * @param keys 作者姓名
     * @param offset 偏移量
     * @param size 结果数量
     * @param filter 过滤器
     * @return 文献内容查询结果
     */
    SearchHits searchByAuthorExact(String keys, int offset, int size, SearchFilter filter);

    /**
     * 根据会议期刊关键字检索会议
     * @param keys 关键字
     * @param offset 偏移量
     * @param size 结果数量
     * @return 查询到的会议列表
     */
    SearchHits searchConferenceByKW(String keys, int offset, int size);

    /**
     * 根据会议期刊关键字检索会议, 带过滤
     * @param keys 关键字
     * @param offset 偏移量
     * @param size 结果数量
     * @param filter 过滤器：精确匹配、年份范围、排序字段与顺序
     * @return 查询结果
     */
    SearchHits searchConferenceByKW(String keys, int offset, int size, SearchFilter filter);

    /**
     * 根据会议唯一id查询该会议下的所有文献
     * @param keys 会议id
     * @param offset 偏移量
     * @param size 结果数量
     * @return 文献结果
     */
    SearchHits searchByConfExact(String keys, int offset, int size);

    /**
     * 根据会议唯一id查询该会议下的所有文献, 带过滤器
     * @param keys 会议id
     * @param offset 偏移量
     * @param size 结果数量
     * @param filter 过滤器，可用：
     * @return 搜索结果
     */
    SearchHits searchByConfExact(String keys, int offset, int size, SearchFilter filter);

    /**
     * 混合查询，输入关键词以在多个字段中模糊检索文献
     * @param keys 关键词
     * @param offset 偏移量
     * @param size 结果数量
     * @return 文献结果
     */
    SearchHits mixedSearch(String keys, int offset, int size);
}